package logica.controladores{
	import	com.jalheart.utils.Punto3D;
	import	com.jalheart.utils.Busquedas;
	import	flash.events.*;
	import	logica.vistas.*;
	import	mx.controls.*;
	import	flash.display.*;
	public	class	CMapa	extends EventDispatcher implements Controlador{
		/**
		La matriz puede contener los siguientes valores:
			->	Un objeto de tipo displayObject, es decir una ficha
			->	null, indica que en esa posición no hay nada ni puede haber, o sea que no hace parte del mapa
			->	1,	indica que en esa posición no hay nada, pero puede haber, es decir, hac eparte del mapa pero está desocupada
		**/
		private	var	_vista			:	VMapa	=	null;
		private	var	_matriz			:	Array;
		private	var	_configuracion	:	XML		=	null;
		private	var	_misFichas		:	Array	=	new	Array();
		public	function	CMapa(laVista:VMapa/*estructura:XML*/):void
		{
			vista	=	laVista;
		}
		public		function	limpiar():void{
			for(var i:uint=0;i<matriz.length;i++)
				for(var j:uint=0;j<matriz[i].length;j++)
					for(var k:uint=0;k<matriz[i][j].length;k++)
						matriz[i][j][k]	=	null;
		}
// 		public	function	agregarFicha(cual:Ficha):void
// 		{
// 			var	i			:	uint		=	0;
// 			var	j			:	uint		=	0;
// 			var	k			:	uint		=	0;
// 			var	hecho		:	Boolean	=	false;
// 			while(!hecho && i<matriz.length)
// 			{
// 				while(!hecho && j<matriz.length)
// 				{
// 					while(!hecho && k<matriz.length)
// 					{
// 						k++;
// 					}
// 					j++;
// 				}
// 				i++;
// 			}
// 		}
		private	function	cargarSet(cual:XML):void
		{
			var	fichaAux	:	VFicha;
			//Alert.show(String(cual.ficha.length()));
			for(var i:uint=0;i<cual.ficha.length();i++)
			{
				for(var j:uint=0;j<cual.ficha[i].@repeticiones;j++)
				{
					fichaAux	=	new VFicha();
					_misFichas.push(fichaAux);
					fichaAux.controlador.configuracion	= XML(cual.ficha[i]);
					//vista.addChild(fichaAux);
					//fichaAux.addEventListener("click",alClickFicha);
				}
			}
			colocarFichasEnMapa(matriz,_misFichas,deMapaXMLAArray(XML(configuracion.mapa)));
			ordenarFichas(matriz,fichaAux.width,fichaAux.height,vista);
			//Alert.show(String(deMapaXMLAArray(XML(configuracion.mapa))));
		}
		
// colocarFichasEnMapa(mapaMatriz,_misFichas,deMapaXMLAArray(mapaActXML));
// _anchoFicha	=	redimencionarFichas(mapaMatriz[0].length,mapaMatriz[0][0].length,_misFichas,miMarco,MARGEN_IZQUIERDO,MARGEN_SUPERIOR);
// _altoFicha		=	_anchoFicha*1.5;
// ordenarFichas(mapaMatriz,_anchoFicha,_altoFicha,miMarco);
// activarFichas(mapaMatriz);
		public	function	ordenarFichas(mapa:Array, anchoFicha:Number, altoFicha:Number, marco:DisplayObjectContainer):void
		/**
		Las fichas qiue estan en la matriz mapa, se visualizan, agregandolas al marco.
		**/
		{
			var mS	:	Number	=	(marco.height-(mapa[0].length*altoFicha))/2;//Margen superior
			var mI	:	Number	=	(marco.width-(mapa[0][0].length*anchoFicha))/2;//Margen Izquierdo
			for(var i:int=0;i<mapa.length;i++)
				for(var j:int=0;j<mapa[i].length;j++)
					for(var k:int=mapa[i][j].length-1;k>=0;k-=1)
						if((mapa[i][j][k]!=null)&&(mapa[i][j][k] is DisplayObject))
						{
							marco.addChild(mapa[i][j][k]);
							mapa[i][j][k].x	=	(k*(mapa[i][j][k].width-(mapa[i][j][k].margenIzquierdo)))+(i*mapa[i][j][k].margenIzquierdo)+mI;
							mapa[i][j][k].y	=	(j*(mapa[i][j][k].height-mapa[i][j][k].margenInferior))-(i*mapa[i][j][k].margenInferior)+mS;
						}
		}
		public	function	colocarFichasEnMapa(mapa:Array,fichas:Array,posiciones:Array):void
		{
			/**
			Se colocan las fichas dentro del mapa, las posiciones son las posibles posiciones en las que se pueden colocar las fichas
			**/
			var	pos		:	uint;
			var	punto	:	Punto3D;
			var i		:	uint;
			var	auxFich	:	Array	=	new	Array();
			for(i=0;i<fichas.length;i++)
				auxFich.push(fichas[i]);
			for(i=0;i<fichas.length;i++)
			{
				pos		=	Math.floor((Math.random()*auxFich.length));
				punto	=	posiciones[i];
				mapa[punto.x][punto.y][punto.z]	=	auxFich[pos];
				auxFich.splice(pos,1);
			}
		}
		private	function	deMapaXMLAArray(mX:XML):Array
		{
			var	res	:	Array	=	new	Array();
			var	i	:	uint;
			var	j	:	uint;
			var	k	:	uint;
			
			for(i=0;i<int(mX.@pisos);i++)
				for(j=0;j<int(mX.@filas);j++)
					for(k=0;k<int(mX.@columnas);k++)
						if(mX.piso[i].fila[j].charAt(k)=="1")
							res.push(new Punto3D(i,j,k));
			return	res;
		}
		protected	function	set	matriz(valor:Array):void
		{
			_matriz	=	valor;
		}
		protected	function	get	matriz():Array
		{
			return	_matriz;
		}
		public	function	set	vista(valor:VMapa):void
		{
			if(_vista!=null)
				_vista.removeEventListener("creationComplete",asignarFondo);
			_vista	=	valor;
			_vista.addEventListener("creationComplete",asignarFondo);
		}
		public	function	asignarFondo(e:Event):void
		{
			if(configuracion!=null)
				vista.imagenFondo.source	=	configuracion.@fondo;
		}
		public	function	get	vista():VMapa
		{
			return	_vista;
		}
		public	function	set configuracion(valor:XML):void
		{
			_configuracion	=	valor;
			
			configuracion.ignoreWhitespace	=	true;
			matriz	=	new	Array(int(configuracion.mapa.@pisos));
			for(var i:uint=0;i<matriz.length;i++)
			{
				matriz[i]	=	new	Array(int(configuracion.mapa.@filas));
				for(var j:uint=0;j<matriz[i].length;j++)
					matriz[i][j]	=	new	Array(int(configuracion.mapa.@columnas));
			}
			if(vista.imagenFondo!=null)
				vista.imagenFondo.source	=	configuracion.@fondo;
			limpiar();
			cargarSet(XML(configuracion.set));
		}
		public	function	get	configuracion():XML
		{
			return	_configuracion;
		}
	}
}